package Utils.db.dao;

import Utils.db.ApacheDbUtilsUtils;
import Utils.db.DruidUtils;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

/**
 * @author d11yu
 */
public abstract class BaseDAO {
    public static final String CONN_STR = "jdbc.properties";

    private static Connection getConnection() {
        return DruidUtils.getInstance(CONN_STR).getConnection(false);
    }
    
    /**
     * 通用增删改操作
     *
     * @param sql    SQL语句
     * @param params 填入SQL语句的参数
     * @return 返回受影响的行数。
     */
    public int update(String sql, Object... params) {
        Connection conn = getConnection();
        return ApacheDbUtilsUtils.update(conn, sql, params);
    }

    /**
     * 查询操作，仅返回一条记录（返回Java Bean），如果返回null，则说明执行失败。
     *
     * @param clazz  返回记录的Java Bean对象类
     * @param sql    SQL语句
     * @param params SQL语句中的插入参数
     * @param <T>
     * @return
     * @throws SQLException
     */
    public static <T> T queryBean(Class<T> clazz, String sql, Object... params) throws SQLException {
        Connection conn = getConnection();
        return ApacheDbUtilsUtils.queryBean(clazz, conn, sql, params);
    }

    /**
     * 查询操作，以Java Bean List的形式返回多条记录，如果返回null，则说明执行失败。
     *
     * @param clazz  返回记录的Java Bean对象类
     * @param sql    SQL语句
     * @param params SQL语句中的插入参数
     * @param <T>
     * @return
     * @throws SQLException
     */
    public static <T> List<T> queryBeanList(Class<T> clazz, String sql, Object... params) throws SQLException {
        Connection conn = getConnection();
        return ApacheDbUtilsUtils.queryBeanList(clazz, conn, sql, params);
    }

    /**
     * 查询操作，仅返回一条记录（返回Map<String,Object>），如果返回null，则说明执行失败。
     *
     * @param sql    SQL语句
     * @param params SQL语句中的插入参数
     * @return
     * @throws SQLException
     */
    public static Map<String, Object> queryMap(String sql, Object... params) throws SQLException {
        Connection conn = getConnection();
        return ApacheDbUtilsUtils.queryMap(conn, sql, params);
    }

    /**
     * 查询操作，以Java Bean List的形式返回多条记录，如果返回null，则说明执行失败。
     *
     * @param sql    SQL语句
     * @param params SQL语句中的插入参数
     * @return
     * @throws SQLException
     */
    public static List<Map<String, Object>> queryMapList(String sql, Object... params) throws SQLException {
        Connection conn = getConnection();
        return ApacheDbUtilsUtils.queryMapList(conn, sql, params);
    }

    /**
     * 查询特殊值，如果返回null，则说明执行失败，如果返回null，则说明执行失败。
     *
     * @param sql    SQL语句
     * @param params SQL语句中的插入参数
     * @return
     * @throws SQLException
     */
    public static Object queryScalar(String sql, Object... params) throws SQLException {
        Connection conn = getConnection();
        return ApacheDbUtilsUtils.queryScalar(conn, sql, params);
    }

    /**
     * 批量更新
     *
     * @param sql
     * @param items
     * @param fdNames
     * @param <T>
     * @return
     */
    public static <T> int[] updateBatch(String sql, List<T> items, String[] fdNames) throws NoSuchFieldException, IllegalAccessException {
        Connection conn = getConnection();
        return ApacheDbUtilsUtils.updateBatch(conn, sql, items, fdNames, false);
    }
}
